package co.com.smart.eagle.client.view.impl;

import java.util.ArrayList;
import java.util.List;

import co.com.smart.eagle.client.view.CrearRecursosView;
import co.com.smart.eagle.client.view.impl.components.SmartImageCell;
import co.com.smart.eagle.client.view.impl.smartcelltable.SmartCellTable;
import co.com.smart.eagle.client.view.impl.smartsimplepager.SmartSimplePager;
import co.com.smart.eagle.infrastructure.dto.RecursosDTO;

import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.ListDataProvider;
import com.sencha.gxt.widget.core.client.button.TextButton;
import com.sencha.gxt.widget.core.client.event.SelectEvent;
import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler;

public class CrearRecursosViewImpl extends Composite implements CrearRecursosView{
	
	@UiField
	protected TextButton btnGrabar;
	
	@UiField
	protected TextButton btnConsultar;
	
	@UiField
	protected TextButton btnLimpiar;
	
	@UiField(provided = true)
	protected SmartSimplePager paginador;
	
	@UiField
	protected SmartCellTable<RecursosDTO> tblRecursos;
	private ListDataProvider<RecursosDTO> dataProvider = new ListDataProvider<RecursosDTO>();
	
	private Presenter presenter;
	
	public enum FocusRecursosPlace {
		ALLOWED,CONTEXT,URI,APPS,ROLES, BTN_SAVE, BTN_SEARCH, BTN_CLEAN;
	}

	private static CrearRecursosViewImplUiBinder uiBinder = GWT
			.create(CrearRecursosViewImplUiBinder.class);

	interface CrearRecursosViewImplUiBinder extends
			UiBinder<Widget, CrearRecursosViewImpl> {
	}

	public CrearRecursosViewImpl() {
		paginador 		= new SmartSimplePager();
		initWidget(uiBinder.createAndBindUi(this));
		initWidgets();
		cleanForm();
	}
	
	public void initWidgets() {

		createTableRoles();
		tblRecursos.setVisible(true);
		btnLimpiar.addSelectHandler(new SelectHandler() {

			@Override
			public void onSelect(SelectEvent event) {
				cleanForm();
				presenter.cargarRecursos();
			}
		});

		btnGrabar.addSelectHandler(new SelectHandler() {

			@Override
			public void onSelect(SelectEvent event) {
				if (presenter.validateCreateRecurso()) {
					presenter.crearRecurso();
				}
			}
		});

		btnConsultar.addSelectHandler(new SelectHandler() {

			@Override
			public void onSelect(SelectEvent event) {
				presenter.cargarRecursos();
			}
		});

	}
	
	/**
	 * Crea la tabla de roles
	 */
	public void createTableRoles() {
		if (tblRecursos.getColumnCount() <= 0) {
			
			TextColumn<RecursosDTO> resourceColumn = new TextColumn<RecursosDTO>() {
				@Override
				public String getValue(RecursosDTO recurso) {
					return String.valueOf(recurso.getIdresource());
				}

			};
			
			TextColumn<RecursosDTO> rolColumn = new TextColumn<RecursosDTO>() {
				@Override
				public String getValue(RecursosDTO recurso) {
					return recurso.getRol().getDsRol();
				}

			};
			
			TextColumn<RecursosDTO> appColumn = new TextColumn<RecursosDTO>() {
				@Override
				public String getValue(RecursosDTO recurso) {
					return recurso.getApplication().getDsAplicacion();
				}

			};
			
			TextColumn<RecursosDTO> contextColumn = new TextColumn<RecursosDTO>() {
				@Override
				public String getValue(RecursosDTO recurso) {
					return recurso.getContextpath();
				}

			};
			
			TextColumn<RecursosDTO> allowedColumn = new TextColumn<RecursosDTO>() {
				@Override
				public String getValue(RecursosDTO recurso) {
					return recurso.getAllowed()?"SI":"NO";
				}

			};
			
			TextColumn<RecursosDTO> uriColumn = new TextColumn<RecursosDTO>() {
				@Override
				public String getValue(RecursosDTO recurso) {
					return recurso.getUri();
				}

			};
			
			SmartImageCell imageEditar = new SmartImageCell("Editar usuario");
			Column<RecursosDTO, String> editarColumn = new Column<RecursosDTO, String>(imageEditar) {
				
				@Override
				public String getValue(RecursosDTO object) {
					return "images/icoSeleccionar.png,true";
				}
			};
			
			editarColumn.setFieldUpdater(new FieldUpdater<RecursosDTO, String>() {
				
				@Override
				public void update(int index, RecursosDTO object, String value) {
					presenter.editRecurso(object);
				}
			});
			
			SmartImageCell imageEliminar = new SmartImageCell("Eliminar recurso");
			Column<RecursosDTO, String> eliminarColumn = new Column<RecursosDTO, String>(imageEliminar) {
				
				@Override
				public String getValue(RecursosDTO object) {
					return "images/icoDelete.png,true";
				}
			};
			
			eliminarColumn.setFieldUpdater(new FieldUpdater<RecursosDTO, String>() {
				
				@Override
				public void update(int index, RecursosDTO object, String value) {
					if(Window.confirm("Esta seguro que desea eliminar el recurso ?")){
						presenter.deleteRecurso(object);
					}
				}
			});


			tblRecursos.setTitle("Lista de recursos");
			tblRecursos.setAutoHeaderRefreshDisabled(true);
			tblRecursos.setWidth("100%");
			tblRecursos.setEmptyTableWidget(new Label("Sin Datos"));
			
			tblRecursos.addColumn(resourceColumn,"Recurso");
			tblRecursos.setColumnWidth(resourceColumn, 60, Style.Unit.PX);
			resourceColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
			
			tblRecursos.addColumn(rolColumn,"Rol");
			tblRecursos.setColumnWidth(rolColumn, 100, Style.Unit.PX);
			rolColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
			
			tblRecursos.addColumn(appColumn,"Aplicaci\u00F3n");
			tblRecursos.setColumnWidth(appColumn, 100, Style.Unit.PX);
			appColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
			
			tblRecursos.addColumn(contextColumn,"Contexto");
			tblRecursos.setColumnWidth(contextColumn, 100, Style.Unit.PX);
			contextColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
			
			tblRecursos.addColumn(uriColumn,"Uri");
			tblRecursos.setColumnWidth(uriColumn, 300, Style.Unit.PX);
			uriColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
			
			tblRecursos.addColumn(allowedColumn,"Permitido");
			tblRecursos.setColumnWidth(allowedColumn, 100, Style.Unit.PX);
			allowedColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
			
			tblRecursos.addColumn(eliminarColumn);
			tblRecursos.setColumnWidth(eliminarColumn, 30, Style.Unit.PX);
			eliminarColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
			
			dataProvider.addDataDisplay(tblRecursos);
			paginador.setDisplay(tblRecursos);
		}
	}

	@Override
	public void setPresenter(Presenter presenter) {
       this.presenter = presenter;		
	}

	@Override
	public void setFocus(FocusRecursosPlace focus) {
		
		
	}

	@Override
	public boolean validatefields() {
		
		return false;
	}

	@Override
	public void cleanForm() {
		setRecursos(new ArrayList<RecursosDTO>());
	}

	@Override
	public void setRecursos(List<RecursosDTO> Recursos) {
		dataProvider.getList().clear();
		dataProvider.getList().addAll(Recursos);
		
	}

	@Override
	public void setTextBtnGrabar(String text) {
		this.btnGrabar.setText(text);		
	}

}
